// Copyright (c) 2024 Go-Frame-Lite
// Go-Frame-Lite is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan
// PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//         http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.

package gerror

// 常用错误码定义
// 类似于GF框架的gcode包

const (
	// 成功
	CodeOK = 0

	// 系统错误 (1-999)
	CodeInternalError    = 1   // 内部错误
	CodeNotImplemented   = 2   // 功能未实现
	CodeServiceUnavailable = 3  // 服务不可用
	CodeTimeout          = 4   // 超时错误
	CodeResourceExhausted = 5  // 资源耗尽

	// 参数错误 (1000-1999)
	CodeInvalidParameter = 1000 // 参数错误
	CodeMissingParameter = 1001 // 缺少参数
	CodeInvalidFormat    = 1002 // 格式错误
	CodeOutOfRange       = 1003 // 参数超出范围
	CodeDuplicateValue  = 1004 // 重复值

	// 认证授权错误 (2000-2999)
	CodeUnauthorized    = 2000 // 未授权
	CodeForbidden       = 2001 // 禁止访问
	CodeTokenExpired    = 2002 // Token过期
	CodeInvalidToken    = 2003 // Token无效
	CodeLoginRequired   = 2004 // 需要登录
	CodePermissionDenied = 2005 // 权限不足

	// 数据错误 (3000-3999)
	CodeDataNotFound    = 3000 // 数据不存在
	CodeDataExists      = 3001 // 数据已存在
	CodeDataInvalid     = 3002 // 数据无效
	CodeDataCorrupted   = 3003 // 数据损坏
	CodeDataLocked      = 3004 // 数据被锁定

	// 网络错误 (4000-4999)
	CodeNetworkError    = 4000 // 网络错误
	CodeConnectionError = 4001 // 连接错误
	CodeDNSLookupFailed = 4002 // DNS查询失败
	CodeSSLHandshakeFailed = 4003 // SSL握手失败

	// 文件操作错误 (5000-5999)
	CodeFileNotFound    = 5000 // 文件不存在
	CodeFilePermission  = 5001 // 文件权限错误
	CodeFileTooLarge    = 5002 // 文件过大
	CodeFileCorrupted   = 5003 // 文件损坏
	CodeDiskFull        = 5004 // 磁盘空间不足

	// 数据库错误 (6000-6999)
	CodeDBConnectionFailed = 6000 // 数据库连接失败
	CodeDBQueryFailed    = 6001 // 数据库查询失败
	CodeDBTransactionFailed = 6002 // 数据库事务失败
	CodeDBConstraintViolation = 6003 // 数据库约束违反
	CodeDBDeadlock       = 6004 // 数据库死锁

	// 业务逻辑错误 (7000-7999)
	CodeBusinessLogicError = 7000 // 业务逻辑错误
	CodeOperationNotAllowed = 7001 // 操作不允许
	CodeBalanceInsufficient = 7002 // 余额不足
	CodeQuotaExceeded    = 7003 // 配额超限
	CodeRateLimit        = 7004 // 频率限制

	// 第三方服务错误 (8000-8999)
	CodeThirdPartyServiceError = 8000 // 第三方服务错误
	CodeAPIQuotaExceeded     = 8001 // API配额超限
	CodeAPIRateLimit        = 8002 // API频率限制
	CodeServiceMaintenance  = 8003 // 服务维护中

	// 加解密错误 (9000-9999)
	CodeEncryptionFailed   = 9000 // 加密失败
	CodeDecryptionFailed   = 9001 // 解密失败
	CodeSignatureInvalid   = 9002 // 签名无效
	CodeCertificateInvalid = 9003 // 证书无效
	CodeKeyExpired         = 9004 // 密钥过期
)

// 错误码描述映射
var codeMessages = map[int]string{
	CodeOK: "成功",

	// 系统错误
	CodeInternalError:     "内部错误",
	CodeNotImplemented:    "功能未实现",
	CodeServiceUnavailable: "服务不可用",
	CodeTimeout:          "请求超时",
	CodeResourceExhausted: "资源耗尽",

	// 参数错误
	CodeInvalidParameter:  "参数错误",
	CodeMissingParameter:  "缺少必要参数",
	CodeInvalidFormat:     "参数格式错误",
	CodeOutOfRange:        "参数超出允许范围",
	CodeDuplicateValue:    "参数值重复",

	// 认证授权错误
	CodeUnauthorized:      "未授权访问",
	CodeForbidden:         "禁止访问",
	CodeTokenExpired:      "Token已过期",
	CodeInvalidToken:      "Token无效",
	CodeLoginRequired:     "需要登录",
	CodePermissionDenied:   "权限不足",

	// 数据错误
	CodeDataNotFound:      "数据不存在",
	CodeDataExists:        "数据已存在",
	CodeDataInvalid:       "数据无效",
	CodeDataCorrupted:     "数据损坏",
	CodeDataLocked:        "数据被锁定",

	// 网络错误
	CodeNetworkError:      "网络错误",
	CodeConnectionError:   "连接错误",
	CodeDNSLookupFailed:  "DNS查询失败",
	CodeSSLHandshakeFailed: "SSL握手失败",

	// 文件操作错误
	CodeFileNotFound:      "文件不存在",
	CodeFilePermission:    "文件权限错误",
	CodeFileTooLarge:      "文件过大",
	CodeFileCorrupted:     "文件损坏",
	CodeDiskFull:          "磁盘空间不足",

	// 数据库错误
	CodeDBConnectionFailed: "数据库连接失败",
	CodeDBQueryFailed:     "数据库查询失败",
	CodeDBTransactionFailed: "数据库事务失败",
	CodeDBConstraintViolation: "数据库约束违反",
	CodeDBDeadlock:        "数据库死锁",

	// 业务逻辑错误
	CodeBusinessLogicError: "业务逻辑错误",
	CodeOperationNotAllowed: "操作不允许",
	CodeBalanceInsufficient: "余额不足",
	CodeQuotaExceeded:     "配额超限",
	CodeRateLimit:         "频率限制",

	// 第三方服务错误
	CodeThirdPartyServiceError: "第三方服务错误",
	CodeAPIQuotaExceeded:      "API配额超限",
	CodeAPIRateLimit:         "API频率限制",
	CodeServiceMaintenance:   "服务维护中",

	// 加解密错误
	CodeEncryptionFailed:    "加密失败",
	CodeDecryptionFailed:    "解密失败",
	CodeSignatureInvalid:    "签名无效",
	CodeCertificateInvalid:  "证书无效",
	CodeKeyExpired:          "密钥过期",
}

// GetMessage 根据错误码获取错误信息
func GetMessage(code int) string {
	if msg, exists := codeMessages[code]; exists {
		return msg
	}
	return "未知错误"
}

// IsSuccess 检查错误码是否表示成功
func IsSuccess(code int) bool {
	return code == CodeOK
}

// IsSystemError 检查错误码是否属于系统错误
func IsSystemError(code int) bool {
	return code >= 1 && code <= 999
}

// IsParameterError 检查错误码是否属于参数错误
func IsParameterError(code int) bool {
	return code >= 1000 && code <= 1999
}

// IsAuthError 检查错误码是否属于认证授权错误
func IsAuthError(code int) bool {
	return code >= 2000 && code <= 2999
}

// IsDataError 检查错误码是否属于数据错误
func IsDataError(code int) bool {
	return code >= 3000 && code <= 3999
}

// IsNetworkError 检查错误码是否属于网络错误
func IsNetworkError(code int) bool {
	return code >= 4000 && code <= 4999
}

// IsFileError 检查错误码是否属于文件操作错误
func IsFileError(code int) bool {
	return code >= 5000 && code <= 5999
}

// IsDBError 检查错误码是否属于数据库错误
func IsDBError(code int) bool {
	return code >= 6000 && code <= 6999
}

// IsBusinessError 检查错误码是否属于业务逻辑错误
func IsBusinessError(code int) bool {
	return code >= 7000 && code <= 7999
}

// IsThirdPartyError 检查错误码是否属于第三方服务错误
func IsThirdPartyError(code int) bool {
	return code >= 8000 && code <= 8999
}

// IsCryptoError 检查错误码是否属于加解密错误
func IsCryptoError(code int) bool {
	return code >= 9000 && code <= 9999
}